package com.example.demo.util;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SftpUtil {
	private JSch jsch;
	private ChannelSftp sftp;
	private Session session;
	
	private String sftpHost;
	private String sftpUsername;
	private String sftpPwd;
	private int sftpPort = 22;
	
	/**
	 * 从配置文件读取sftp连接信息
	 * @param initProp
	 */
	public SftpUtil(boolean initProp) {
		if(!initProp) {
			PropertiesUtil.initProperty();
		}
		sftpHost = PropertiesUtil.getProperty("sftp.host");
		sftpUsername = PropertiesUtil.getProperty("sftp.username");
		sftpPwd = PropertiesUtil.getProperty("sftp.passwd");
		sftpPort = Integer.parseInt(PropertiesUtil.getProperty("sftp.port"));
	}

	/**
	 * 自己传入sftp连接属性(使用sftp默认端口)
	 * @param sftpHost
	 * @param sftpUser
	 * @param sftpPwd
	 */
	public SftpUtil(String sftpHost, String sftpUser, String sftpPwd) {
		super();
		this.sftpHost = sftpHost;
		this.sftpUsername = sftpUser;
		this.sftpPwd = sftpPwd;
	}

	/**
	 * 自己传入sftp连接属性
	 * @param sftpHost
	 * @param sftpUser
	 * @param sftpPwd
	 * @param sftpPort
	 */
	public SftpUtil(String sftpHost, String sftpUser, String sftpPwd, int sftpPort) {
		super();
		this.sftpHost = sftpHost;
		this.sftpUsername = sftpUser;
		this.sftpPwd = sftpPwd;
		this.sftpPort = sftpPort;
	}
	
	/**
	 * 
	 * @方法名 SftpUtil.java
	 * @创建者 xzw
	 * @创建日期 2021年11月7日
	 * @返回类型 void
	 * @功能描述 创建sftp连接,获取jsch、session、ChannelSftp对象
	 *
	 */
	public void connect() throws Exception {
		jsch = new JSch();
		
		session = jsch.getSession(sftpUsername, sftpHost, sftpPort);
		
		session.setPassword(sftpPwd);
		
		session.setConfig(getSshConfig());
		
		session.connect();
		
		sftp = (ChannelSftp) session.openChannel("sftp");
		
		sftp.connect();
		
		if(sftp.isConnected()) {
			log.info("连接sftp服务成功");
		} else {
			throw new RuntimeException("连接sftp服务失败");
		}
	}
	
	/**
	 * 
	 * @方法名 SftpUtil.java
	 * @创建者 xzw
	 * @创建日期 2021年11月7日
	 * @返回类型 void
	 * @功能描述 断开sftp连接
	 *
	 */
	public void disConnect() throws Exception {
		if(sftp.isConnected()) {
			sftp.disconnect();
		}
		
		if(session.isConnected()) {
			session.disconnect();
		}
	}
	
	/**
	 * 
	 * @方法名 SftpUtil.java
	 * @创建者 xzw
	 * @创建日期 2021年11月7日
	 * @返回类型 Properties
	 * @功能描述 ssh配置
	 *
	 */
	public Properties getSshConfig() {
		Properties sshConfig = new Properties();
		
		sshConfig.put("StrictHostKeyChecking", "no");
		
		return sshConfig;
	}
	
	/**
	 * 
	 * @方法名 SftpUtil.java
	 * @创建者 xzw
	 * @创建日期 2021年11月7日
	 * @返回类型 void
	 * @功能描述 上传文件
	 *
	 */
	public void uploadFile(String fileDir,String fileName,InputStream fileStream) throws Exception{
		if(fileDir.endsWith("/")) {
			fileDir = fileDir.substring(0, fileDir.length()-1);
		}
		
		
		try {
			connect();
			
			checkDirExists(fileDir);
			
			sftp.put(fileStream, fileDir+"/"+fileName);
		} finally {
			if(null != fileStream) {
				fileStream.close();
			}
			disConnect();
		}
	}

	/**
	 * 
	 * @方法名 SftpUtil.java
	 * @创建者 xzw
	 * @创建日期 2021年11月7日
	 * @返回类型 void
	 * @功能描述 检查路径是否存在,不存在则创建
	 *
	 */
	private void checkDirExists(String linuxPath) throws Exception{
		String[] paths = linuxPath.split("/");
		
		String dir = paths[0];
		
		for (int i = 1; i < paths.length; i++) {
			dir = dir + "/" +paths[i];
			
			try {
				sftp.cd(dir);
			} catch (SftpException e) {
				if(e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {
					sftp.mkdir(dir);
				}
			}
		}
	}
	
	public static void main(String[] args) throws Exception {
		new SftpUtil(false).uploadFile("/home/xzw/file-content/2021/11/02", "2.jpg", new FileInputStream("E:\\图片\\2.jpg"));
	}
}
